<?php

class RolesModel extends CustomModel
{

    public function getRoles($pageNumber)
    {
        $rolesAbm = new ABM('roles');
        return $rolesAbm->getPaginated($pageNumber, array('status' => STATUS_ONLINE), 10, 'nombre_rol ASC', true);
    }

    public function getAllRoles()
    {
        $rolesAbm = new ABM('roles');
        return $rolesAbm->get(array('status' => STATUS_ONLINE), 'nombre_rol ASC');
    }

    public function getUsuarios($pageNumber)
    {
        $usuariosAbm = new ABM('users');
        $filter = array(
            'user_status' => STATUS_ONLINE,
            'user_type'   => USER_TYPE_ADMIN,
        );
        $joins = array(
            'roles' => array(
                'type' => 'LEFT',
                'on'   => array('roles.idrol' => 'users.fkrol')
            )
        );
        return $usuariosAbm->getPaginatedWithJoin($pageNumber, $filter, $joins, 10, 'users.username ASC', true);
    }

    public function getAllUsuarios()
    {
        $usuariosAbm = new ABM('users');
        $filter = array(
            'user_status' => STATUS_ONLINE,
            'user_type'   => USER_TYPE_ADMIN,
        );
        return $usuariosAbm->get($filter);
    }

    public function getRol($idRol)
    {
        $rolesAbm = new ABM('roles');
        if ($rol = $rolesAbm->get(array('idrol' => $idRol, 'status' => STATUS_ONLINE)))
        {
            $rol = $rol[$idRol];
            $rol['acciones'] = array('permitidas' => array(), 'no_permitidas' => array());
            $accionesPorRolAbm = new ABM('acciones_por_rol');
            $accionesPorRol = $accionesPorRolAbm->getWithJoin(array('fkrol' => $idRol), array('acciones' => array('acciones.idaccion' => 'acciones_por_rol.fkaccion')), false, false, false);
            if (!empty($accionesPorRol))
            {
                foreach ($accionesPorRol as $accion)
                {
                    if ($accion['permiso'] == STATUS_ONLINE)
                    {
                        $rol['acciones']['permitidas'][$accion['idaccion']] = $accion;
                    }
                    else if ($accion['permiso'] == STATUS_OFFLINE)
                    {
                        $rol['acciones']['no_permitidas'][$accion['idaccion']] = $accion;
                    }
                }
            }
            return $rol;
        }
        else
        {
            return false;
        }
    }

    public function nombreExists($nombre, $idRol = false)
    {
        $rolesAbm = new ABM('roles');
        $ex = $rolesAbm->get(array('nombre_rol' => $nombre, 'status' => STATUS_ONLINE));
        if (!$idRol)
        {
            return $ex;
        }
        else
        {
            if ($ex)
            {
                if (!empty($ex[$idRol]))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
    }

    public function guardarRol($rol, $permitidas, $noPermitidas)
    {
        $this->db->beginTransaction();
        $rolesAbm = new ABM('roles');
        if ($idRol = $rolesAbm->insert(array('nombre_rol' => $rol['nombre'], 'descripcion' => $rol['descripcion'], 'status' => STATUS_ONLINE)))
        {
            $accionesPorRolAbm = new ABM('acciones_por_rol');
            if (!empty($permitidas))
            {
                foreach ($permitidas as $accion)
                {
                    $accionPorRol = array(
                        'fkrol'    => $idRol,
                        'fkaccion' => $accion['idaccion'],
                        'permiso'  => STATUS_ONLINE
                    );
                    if ($accionesPorRolAbm->insert($accionPorRol, false))
                    {
                        // foo
                    }
                    else
                    {
                        $this->db->rollbackTransaction();
                        return false;
                    }
                }
            }
            if (!empty($noPermitidas))
            {
                foreach ($noPermitidas as $accion)
                {
                    $accionPorRol = array(
                        'fkrol'    => $idRol,
                        'fkaccion' => $accion['idaccion'],
                        'permiso'  => STATUS_OFFLINE
                    );
                    if ($accionesPorRolAbm->insert($accionPorRol, false))
                    {
                        // foo
                    }
                    else
                    {
                        $this->db->rollbackTransaction();
                        return false;
                    }
                }
            }
            $this->db->commitTransaction();
            return true;
        }
        else
        {
            $this->db->rollbackTransaction();
            return false;
        }
    }

    public function editarRol($idRol, $rol, $permitidas, $noPermitidas)
    {
        $this->db->beginTransaction();
        $rolesAbm = new ABM('roles');
        if ($rolesAbm->update(array('idrol' => $idRol), array('nombre_rol' => $rol['nombre_rol'], 'descripcion' => $rol['descripcion'], 'status' => STATUS_ONLINE)))
        {
            // Delete current
            $delAccionesPorRol = "DELETE FROM acciones_por_rol WHERE fkrol = $idRol;";
            if (!$this->db->rawQuery($delAccionesPorRol))
            {
                $this->db->rollbackTransaction();
                return false;
            }
            // Insert
            $accionesPorRolAbm = new ABM('acciones_por_rol');
            if (!empty($permitidas))
            {
                foreach ($permitidas as $accion)
                {
                    $accionPorRol = array(
                        'fkrol'    => $idRol,
                        'fkaccion' => $accion['idaccion'],
                        'permiso'  => STATUS_ONLINE
                    );
                    if ($accionesPorRolAbm->insert($accionPorRol, false))
                    {
                        // foo
                    }
                    else
                    {
                        $this->db->rollbackTransaction();
                        return false;
                    }
                }
            }
            if (!empty($noPermitidas))
            {
                foreach ($noPermitidas as $accion)
                {
                    $accionPorRol = array(
                        'fkrol'    => $idRol,
                        'fkaccion' => $accion['idaccion'],
                        'permiso'  => STATUS_OFFLINE
                    );
                    if ($accionesPorRolAbm->insert($accionPorRol, false))
                    {
                        // foo
                    }
                    else
                    {
                        $this->db->rollbackTransaction();
                        return false;
                    }
                }
            }
            $this->db->commitTransaction();
            return true;
        }
        else
        {
            $this->db->rollbackTransaction();
            return false;
        }
    }

    public function asignarRol($iduser, $fkrol)
    {
        $usuariosAbm = new ABM('users');
        if ($usuariosAbm->update(array('iduser' => $iduser), array('fkrol' => $fkrol)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public function borrarRol($idRol)
    {
        $this->db->beginTransaction();
        $rolesAbm = new ABM('roles');
        if ($rolesAbm->update(array('idrol' => $idRol), array('status' => STATUS_OFFLINE)))
        {
            // Delete current
            $delAccionesPorRol = "DELETE FROM acciones_por_rol WHERE fkrol = $idRol;";
            if (!$this->db->rawQuery($delAccionesPorRol))
            {
                $this->db->rollbackTransaction();
                return false;
            }
            else
            {
                $this->db->commitTransaction();
                return true;
            }
        }
        else
        {
            $this->db->rollbackTransaction();
            return false;
        }
    }

}

?>